﻿namespace los6
{
    #region     知识点一   索引器基本概念
    //基本概念
    //让对象可以像数组一样通过索引访问其中元素，使元素看起来更直观，更容易编写
    #endregion
    #region     知识点二   索引器语法
    //访问修饰符 返回值 this[参数类型 参数名,参数类型 参数名...]
    //{
    //     内部的写法的规则和索引器相同
    //     get{}
    //     set{}
    //}
    class Person
    {
        private string name;
        private int age;
        private Person[] friends;
        #region     知识点五   索引器可以重载
        //重载的概念是—函数名相同  参数类型、数量、顺序不同
        #endregion
        public Person this[int index]
        {
            #region     知识点四   索引器中可以写逻辑
            #endregion
            get
            {
                //可以写逻辑的 根据需求来处理这里面的内容（set也是）
                if(friends == null || friends.Length - 1 < 0)
                {
                    return null;
                }
                return friends[index];
            }
            set
            {
                //value代表传入的值
                if (friends == null)
                {
                    friends = new Person[] { value };
                }
                else if(index > friends.Length - 1)
                {
                    //自己定了一个规则 如果索引越界 就默认把最后一个朋友顶掉
                    friends[friends.Length - 1] = value;
                }
                    friends[index] = value;
            }
        }
    }
    #endregion
    internal class class6
    {
        static void Main(string[] args)
        {
            Console.WriteLine("索引器");
            #region     知识点三   索引器的使用
            Person p = new Person();
            p[0] =new Person();
            Console.WriteLine(p[0]);
            #endregion
            //总结
            //索引器对于我们来说的主要作用
            //可以让我们以中括号的形式范围自定义类中的元素 规则自己定 访问时和数组一样
            //比较适用于 在类中有数组变量时使用 可以方便的访问和进行逻辑处理

            //固定写法
            //访问修饰符 返回值 this[参数列表]
            //get和set语句块
            //可以重载

            //注意：结构体里面也支持索引器

            #region     作业
            //自定义一个整形数组类，该类中有一个整形数组变量为他封装增删查改的方法
            Intarray array = new Intarray();
            array.Add(100);
            array.Add(200);
            //array.RmoveAt(0);
            array.Remove(200);
            Console.WriteLine(array[0]);
            Console.WriteLine(array.length);
            #endregion
        }
    }
    class Intarray
    {
        private int[] array;
        //房间容量
        private int capacity;
        //当前几个房间里有内容
        private int Length; 
        public Intarray()
        {
            capacity = 5;
            Length = 0;
            array = new int[capacity];
        }
        //增
        public void Add(int value)
        {
            //如果要增加，就涉及扩容
            //扩容就涉及“搬家 ”
            if(Length < capacity)
            {
                array[Length] = value;
                ++Length;
            }
            //扩容
            else
            {
                capacity *= 2;
                int[] tempArray = new int[capacity];
                //把老数据放到新数组里
                for(int i = 0; i < array.Length; i++)
                {
                    tempArray[i] = array[i];
                }
                //老房子地址指向新房子地址
                array = tempArray;
            }
        }
        //删
        //找到 传入值 在哪个位置
        public void Remove (int value)//指定一个值去删它
        {
            for(int i = 0; i < Length; i++)
            {
                if (array[i] == value)
                {
                    RmoveAt(i);
                    return;
                }
            }
            Console.WriteLine("没有在数组中找到{0}",value);
        }
        public void RmoveAt(int index)//根据位置删除 
        {
            if(index > Length - 1)
            {
                Console.WriteLine("当前数组长度不够！");
                return;
            }
            for(int i = index;i < Length;i++)
            {
                //用后面的数把前面填满，最后空出最后一个房间
                array[i] = array[i + 1];
            }
            --Length;//减掉空出来的房间
        }
        //查改
        public int this[int index]
        {
            get
            {
                if (index >= Length || index < 0)
                {
                    Console.WriteLine("越界！");
                }
                return array[index];
            }
            set
            {
                if (index >= Length || index < 0)
                {
                    Console.WriteLine("越界！");
                }
                array[index] = value;
            }
        }
        public int length
        {
            get
            {
                return Length;
            }
        }
    }
}
